const moment = require('./moment')
/**
 * 转json字符串
 * @param {*} data 数据
 */
export function stringify(data) {
  return encodeURIComponent(JSON.stringify(data))
}

/**
 * 解析json字符串
 * @param {*} data 字符串数据
 */
export function parse(data) {
  let result
  try {
    result = JSON.parse(decodeURIComponent(data))
  } catch (e) {
    console.log('parse error', e)
  }
  return result
}

/**
 * 患者关系代码转患者关系
 * @param {*} data 患者关系代码
 */
export function contactRelationType(data) {
  let contactRelationType = ''
  const type = {
    1: '配偶',
    2: '子',
    3: '女',
    4: '孙子、孙女、或外孙子、外孙女',
    5: '父母',
    6: '祖父母',
    7: '外祖父母',
    8: '兄、弟、姐、妹',
    9: '其他',
  }
  contactRelationType = type[data]
  return contactRelationType
}

/**
 * 患者关系转患者关系代码
 * @param {*} data 患者关系
 */
export function contactRelation(data) {
  let contactRelation = ''
  const type = {
    父母: 5,
    祖父母: 6,
    外祖父母: 7,
    其他: 9,
  }
  contactRelation = type[data]
  return contactRelation
}

/**
 * 计算年龄
 * @param {*} age 出生日期
 */
export function calculateAge(age) {
  const birthday = age.substring(0, 10)
  let ageText = ''
  let deliveryDate = moment(age) //用moment来显示获取的日期
  let ageDate = moment.duration(moment().diff(deliveryDate)) //作对比.显示天数
  let { _data } = ageDate
  if (_data.years) {
    ageText = _data.years + '岁' + _data.months + '月'
  } else if (_data.months) {
    ageText = _data.months + '月' + _data.days + '天'
  } else {
    ageText = _data.days + '天'
  }
  return ageText
}

/**
 * 两位数以内的数字自动补零
 * @param {*} n
 */
export function formatNumber(n) {
  n = n.toString()
  return n[1] ? n : '0' + n
}

/**
 * 获取今日日期数据
 */
export function getTodayDate() {
  const today = new Date()
  return {
    year: today.getFullYear().toString(),
    month: formatNumber(today.getMonth() + 1),
    day: formatNumber(today.getDate()),
    hour: formatNumber(today.getHours()),
    minute: formatNumber(today.getMinutes()),
    second: formatNumber(today.getSeconds()),
  }
}
/**
 * 根据日期计算周
 */
export function getWeek(day) {
  const weekday = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
  const week = weekday[new Date(day).getDay()] //判断今天周几
  return {
    week,
  }
}
/**
 * 时间戳转化为年 月 日 时 分 秒
 * time: 需要被格式化的时间，可以被new Date()解析即可
 * format：格式化之后返回的格式，年月日时分秒分别为Y, M, D, h, m, s，这个参数不填的话则显示多久前
 */
export function formatTime(time, format) {
  function getDate(time, format) {
    const formateArr = ['Y', 'M', 'D', 'h', 'm', 's']
    const returnArr = []
    const date = new Date(time)
    returnArr.push(date.getFullYear())
    returnArr.push(formatNumber(date.getMonth() + 1))
    returnArr.push(formatNumber(date.getDate()))
    returnArr.push(formatNumber(date.getHours()))
    returnArr.push(formatNumber(date.getMinutes()))
    returnArr.push(formatNumber(date.getSeconds()))
    for (const i in returnArr) {
      format = format.replace(formateArr[i], returnArr[i])
    }
    return format
  }
  if (!format) {
    return getDateDiff(time)
  } else {
    return getDate(time, format)
  }
}

/**
 * 校验身份证号格式
 * @param {*} str
 */
export function isCard(code) {
  var city = {
    11: '北京',
    12: '天津',
    13: '河北',
    14: '山西',
    15: '内蒙古',
    21: '辽宁',
    22: '吉林',
    23: '黑龙江 ',
    31: '上海',
    32: '江苏',
    33: '浙江',
    34: '安徽',
    35: '福建',
    36: '江西',
    37: '山东',
    41: '河南',
    42: '湖北 ',
    43: '湖南',
    44: '广东',
    45: '广西',
    46: '海南',
    50: '重庆',
    51: '四川',
    52: '贵州',
    53: '云南',
    54: '西藏 ',
    61: '陕西',
    62: '甘肃',
    63: '青海',
    64: '宁夏',
    65: '新疆',
    71: '台湾',
    81: '香港',
    82: '澳门',
    91: '国外 ',
  }
  let pass = true
  let codeReg =
    /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
  //验证身份证格式（6个地区编码，8位出生日期，3位顺序号，1位校验位）
  if (!code || !codeReg.test(code)) {
    pass = false
  } else if (!city[code.substr(0, 2)]) {
    pass = false
  } else {
    //18位身份证需要验证最后一位校验位
    if (code.length == 18) {
      code = code.split('')
      //∑(ai×Wi)(mod 11)
      //加权因子
      let factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
      //校验位
      let parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
      let sum = 0
      let ai = 0
      let wi = 0
      for (let i = 0; i < 17; i++) {
        ai = code[i]
        wi = factor[i]
        sum += ai * wi
      }
      let last = parity[sum % 11]
      if (parity[sum % 11] != code[17]) {
        pass = false
      }
    }
  }
  return pass
}

/**
 * 获取信号栏高度
 * @param {boolean} init 是否是初始化数据
 */
export function getBarAndTitleHeight(init = false) {
  if (init) {
    return {
      barHeight: 0,
      titleHeight: 0,
      signalHeight: 0,
    }
  }
  const systemInfo = wx.getSystemInfoSync()
  // px转换到rpx的比例
  const pxToRpxScale = 750 / systemInfo.windowWidth
  // 状态栏的高度
  const barHeight = systemInfo.statusBarHeight * pxToRpxScale
  // 导航栏高度，这个一般是固定的
  const titleHeight = 44 * pxToRpxScale
  return {
    barHeight,
    titleHeight,
    signalHeight: systemInfo.statusBarHeight + 44,
  }
}

/**
 * 截取手机号，中间四位用*显示
 * @param {*} n
 */
export function formatTelephone(n) {
  var reg = /^(\d{3})\d{4}(\d{4})$/
  n = n.replace(reg, '$1****$2')
  return n
}

/**
 * 获取存储
 * @param {*} key
 */
export function getStorage(key) {
  if (key) {
    return wx.getStorageSync(`${__wxConfig.envVersion}_${key}`)
  }
  return null
}

/**
 * 设置存储
 * @param {*} key
 * @param {*} val
 */
export function setStorage(key, val) {
  if (key) {
    wx.setStorageSync(`${__wxConfig.envVersion}_${key}`, val)
  }
}

/**
 * 删除存储
 * @param {*} key
 */
export function removeStorage(key) {
  if (key) {
    wx.removeStorageSync(`${__wxConfig.envVersion}_${key}`)
  }
}

/**
 * 清空存储
 */
export function clearStorage() {
  wx.clearStorageSync()
}

/**
 * 数组元素交换位置
 * @param {array} arr 数组
 * @param {number} index1 添加项目的位置
 * @param {number} index2 删除项目的位置
 * index1和index2分别是两个数组的索引值，即是两个要交换元素位置的索引值，如1，5就是数组中下标为1和5的两个元素交换位置
 */
export function swapArray(arr, index1, index2) {
  arr[index1] = arr.splice(index2, 1, arr[index1])[0]
  return arr
}
/**
 *
 * @param {*string} yearMonth 年份-月份 例如：2022-02
 */
export function getTwoNaturalWeek(yearMonth) {
  // 一周七天
  var weekDays = 7
  // 展示天数
  var resList = []
  // 组装此月的第一天
  var startDate = new Date(yearMonth + '-01')
  var startDateNum = startDate.getDate()
  // 计算出从此月第一天起展示多少日
  var showDays = 2 * weekDays - startDate.getDay()
  console.log('yearMonth', yearMonth)
  console.log('startDate', startDate)
  console.log('startDateNum', startDateNum)
  console.log('showDays', showDays)

  for (let i = 0; i < showDays; i++) {
    console.log(`${yearMonth}-${startDateNum + i}`)
    let dateStr = new Date(`${yearMonth}-${formatNumber(startDateNum + i)}`)
    resList.push(formatTime(dateStr, 'Y-M-D'))
  }
  return resList
}

/**
 * 距离所传入日期多久前
 *
 * @param date
 * @return
 */
export function getTimeFormatText(date) {
  let minute = 60 * 1000 // 1分钟
  let hour = 60 * minute // 1小时
  let day = 24 * hour // 1天
  let month = 31 * day // 月
  let year = 12 * month // 年
  if (date == null) {
    return null
  }
  let diff = new Date().getTime() - date.getTime()
  let r = 0
  if (diff > year) {
    r = Math.floor(diff / year)
    return r + '年前'
  }
  if (diff > month) {
    r = Math.floor(diff / month)
    return r + '个月前'
  }
  if (diff > day) {
    r = Math.floor(diff / day)
    return r + '天前'
  }
  if (diff > hour) {
    r = Math.floor(diff / hour)
    return r + '个小时前'
  }
  if (diff > minute) {
    r = Math.floor(diff / minute)
    return r + '分钟前'
  }
  return '刚刚'
}

/**
 * 验证手机号是否正确
 * @param {*} n 
 */
export function isPhoneRight(tel) {
  let reg_tel = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
  return reg_tel.test(tel)
}